#include "Cargar_Archivo.h"

void Cargar_Archivo::cargar_personas(Sistema& sistema, string rutaRegistros) {
	std::ifstream archEntrada(rutaRegistros.c_str(), std::ios::in);

	int v_correctos = 0;
	int v_incorrectos = 0;
	int v_linea_numero =0;

	cout << "Carga Masiva de Personas: " << endl;
	while(!archEntrada.eof()) {
		string linea;
		getline(archEntrada, linea);

		if (linea.size() > 0) {
			v_linea_numero++;

			cout<< "Linea Numero " << v_linea_numero << endl;
			cout << linea << endl;


			//DNI:
			int pos_coma = linea.find(',');
			int v_dni = Utilitarios::stringToInt(linea.substr(0, pos_coma));
			string cadena2 = linea.substr(pos_coma+1);
			//		cout << "v_dni: " << v_dni << endl;


			//NOMBRE:
			pos_coma = cadena2.find(',');
			string v_nombre = cadena2.substr(0, pos_coma);
			cadena2 = cadena2.substr(pos_coma+1);

			//		cout << "v_nombre: " << v_nombre  << endl;


			//APELLIDO:
			pos_coma = cadena2.find(',');
			string v_apellido = cadena2.substr(0, pos_coma);
			cadena2 = cadena2.substr(pos_coma+1);

			//		cout << "v_apellido: " << v_nombre << endl;


			//LISTA DE EMAILS:
			pos_coma = cadena2.find(',');
			std::vector<string> emails;
			string v_lista_email = cadena2.substr(0, pos_coma);
			//		cout << "v_lista_email: " << v_lista_email << endl;


			unsigned v_cantidad_mails = 0;
			while  (v_lista_email.size()>0)
			{
				int pos_separador_mail = v_lista_email.find('|');

				emails.push_back (v_lista_email.substr(0, pos_separador_mail));
				v_lista_email = v_lista_email.substr(pos_separador_mail+1);
				v_cantidad_mails++;
			}


			cadena2 = cadena2.substr(pos_coma+1);


			//PASSWORD:
			pos_coma = cadena2.find(',');
			string v_password = cadena2.substr(0, pos_coma);
			cadena2 = cadena2.substr(pos_coma+1);

			//		cout << "v_password: " << v_password << endl;

			//PROVINCIA:
			pos_coma = cadena2.find(',');
			string v_provincia = cadena2.substr(0, pos_coma);
			cadena2 = cadena2.substr(pos_coma+1);

			//		cout << "v_provincia: " << v_provincia << endl;

			//TIPO DE USUARIO:
			pos_coma = cadena2.find(',');
			string v_str_tipo_usuario = cadena2.substr(0, pos_coma);
			char v_tipo_usuario = v_str_tipo_usuario[0];

			//		cout << "v_str_tipo_usuario: " << v_str_tipo_usuario << endl;




			//CREACION DEL OBJETO

			Usuario user1(v_dni, v_nombre, v_apellido,v_tipo_usuario);
			cout  << "Objeto Creado. "<< endl;

			//Setters para los demas campos del Objeto:
			user1.setPassword(v_password);
			user1.setProvincia(v_provincia);
			user1.setTipo(v_tipo_usuario);

			for(unsigned i=0; i < v_cantidad_mails; i++) {
				string email;
				user1.addEmail(emails[i]);
			}

			//Visualizo los datos del Objeto:
			cout << "Datos almacenados en el objeto"<< endl;
			cout << "Nombre: " + user1.getNombre() << endl;
			cout << "Apellido: " + user1.getApellido()<< endl;
			cout << "Provincia: " + user1.getProvincia()<< endl;
			cout << "Password: " + user1.getPassword()<< endl;
			cout << "Tipo: " << user1.getTipo()<< endl;

			for(unsigned i=0; i < v_cantidad_mails; i++) {
				cout << "Email n "<< i << ": " << user1.getEmail(i)<< endl;
			}


			cout << "Grabar el nuevo objeto a disco: ";


			bool v_resultado = false;

			v_resultado = sistema.registrarUsuario(user1);

			if (v_resultado){
				cout << "El usuario se ha grabado correctamente." << endl;
				v_correctos++;
			}
			else
			{
				cout << "Se presentaron problemas durante la grabación de los datos." << endl;
				v_incorrectos++;
			}

			cout << "Fin de La Linea" << endl;
		}
	}
	cout << "Fin de Archivo" << endl;
	archEntrada.close();
	cout <<  endl;
	cout << "****************************************************" << endl;
	cout << "Cantidad de Registros: "<< (v_correctos + v_incorrectos) << endl;
	cout << "Registros Procesados Correctamente: "<< v_correctos << endl;
	cout << "Registros con Errores: "<< v_incorrectos << endl;
}

void Cargar_Archivo::cargar_categorias(Sistema& sistema, string rutaRegistros, bool vervose) {
	std::ifstream archEntrada(rutaRegistros.c_str(), std::ios::in);

	int v_incorrectos = 0;
	int v_correctos = 0;
	int v_linea_numero = 0;

	while(!archEntrada.eof()) {
		string linea;
		getline(archEntrada, linea);

		if (linea.size() > 0)
		{
			v_linea_numero++;

			if(vervose) {
			cout<< "Linea Numero " << v_linea_numero << endl;
			cout << linea << endl;
			}
			//ID:
			int pos_coma = linea.find(',');

			int v_id = Utilitarios::stringToInt(linea.substr(0, pos_coma));

			string cadena2 = linea.substr(pos_coma+1);
			if(vervose)
			cout << "v_id: " << v_id << endl;

			//NOMBRE:
			pos_coma = cadena2.find(',');

			string v_nombre = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);
			if(vervose)
			cout << "v_nombre: " << v_nombre << endl;

			//DESCRIPCION:
			pos_coma = cadena2.find(',');

			string v_descripcion = cadena2.substr(0, pos_coma);
			if(vervose)
			cout << "v_descripcion: " << v_descripcion << endl;



			//CREACION DEL OBJETO

			Categoria categoria1(v_id,v_nombre);
			if(vervose)
			cout  << "Objeto Creado. "<< endl;

			//Setters:
			categoria1.setDescripcion(v_descripcion);

			if(vervose) {
			//Visualizo los datos del Objeto:
			cout << "Datos almacenados en el objeto"<< endl;
			cout << "Nombre: " + categoria1.getNombre()<< endl;
			cout << "Descripcion: " + categoria1.getDescripcion()<< endl;


			cout << "Grabar el nuevo objeto a disco: ";
			}
			bool v_resultado = false;

			v_resultado = sistema.crearCategoria(categoria1);

			if(vervose) {
			if (v_resultado){
				cout << "La categoria se ha grabado correctamente." << endl;
				v_correctos++;
			}
			else
			{
				cout << "Se presentaron problemas durante la grabación de los datos." << endl;
				v_incorrectos++;
			}
			cout << "Fin de La Linea" << endl;
			}
		}
	}
	archEntrada.close();
	if(vervose) {
	cout << "Fin de Archivo" << endl;
	cout <<  endl;
	cout << "****************************************************" << endl;
	cout << "Cantidad de Registros: "<< (v_correctos + v_incorrectos) << endl;
	cout << "Registros Procesados Correctamente: "<< v_correctos << endl;
	cout << "Registros con Errores: "<< v_incorrectos << endl;
	}
}

void Cargar_Archivo::cargar_servicios(Sistema& sistema, string rutaRegistros) {
	std::ifstream archEntrada(rutaRegistros.c_str(), std::ios::in);

	int v_incorrectos = 0;
	int v_correctos = 0;
	int v_linea_numero = 0;


	while(!archEntrada.eof()) {
		string linea;
		getline(archEntrada, linea);

		if (linea.size() > 0) {
			v_linea_numero++;

			cout<< "Linea Numero " << v_linea_numero << endl;
			cout << linea << endl;

			//IdServicio:
			int pos_coma = linea.find(',');

			int v_idServicio = Utilitarios::stringToInt(linea.substr(0, pos_coma));

			string cadena2 = linea.substr(pos_coma+1);

			cout<< "v_idServicio: " << v_idServicio << endl;


			//IdProveedor:
			pos_coma = cadena2.find(',');

			int v_idProveedor = Utilitarios::stringToInt(cadena2.substr(0, pos_coma));

			cadena2 = cadena2.substr(pos_coma+1);

			cout<< "v_idProveedor: " << v_idProveedor << endl;

			//IdCategoria:
			pos_coma = cadena2.find(',');

			int v_IdCategoria = Utilitarios::stringToInt(cadena2.substr(0, pos_coma));

			cadena2 = cadena2.substr(pos_coma+1);

			cout<< "v_IdCategoria: " << v_IdCategoria << endl;


			//NOMBRE:
			pos_coma = cadena2.find(',');

			string v_nombre = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout<< "v_nombre: " << v_nombre << endl;

			//DESCRIPCION:
			pos_coma = cadena2.find(',');

			string v_descripcion = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout<< "v_descripcion: " << v_descripcion << endl;

			//TIPO:
			pos_coma = cadena2.find(',');

			string v_tipo = cadena2.substr(0, pos_coma);

			cout<< "v_tipo: " << v_tipo << endl;


			//CREACION DEL OBJETO


			Servicio servicio1(v_idServicio, v_nombre, v_idProveedor, v_tipo);
			servicio1.addCategoria(v_IdCategoria);

			cout  << "Objeto Creado. "<< endl;


			//Setters:
			servicio1.setDescripcion(v_descripcion);



			//Visualizo los datos del Objeto:
			cout << "Datos almacenados en el objeto"<< endl;
			cout << "Id_proveedor: " << servicio1.getIdProveedor()<< endl;
			cout << "Nombre: " + servicio1.getNombre()<< endl;
			cout << "Descripcion: " + servicio1.getDescripcion()<< endl;
			cout << "Tipo: " + servicio1.getTipo()<< endl;


			cout << "Grabar el nuevo objeto a disco: ";


			bool v_resultado = false;

			v_resultado = sistema.crearServicio(servicio1);

			if (v_resultado){
				cout << "El servicio se ha grabado correctamente." << endl;
				v_correctos++;
			}
			else
			{
				cout << "Se presentaron problemas durante la grabación de los datos." << endl;
				v_incorrectos++;
			}
			cout << "Fin de La Linea" << endl;
		}
	}
	cout << "Fin de Archivo" << endl;
	archEntrada.close();
	cout <<  endl;
	cout << "****************************************************" << endl;
	cout << "Cantidad de Registros: "<< (v_correctos + v_incorrectos) << endl;
	cout << "Registros Procesados Correctamente: "<< v_correctos << endl;
	cout << "Registros con Errores: "<< v_incorrectos << endl;
}

void Cargar_Archivo::cargar_consultas(Sistema& sistema, string rutaRegistros) {
	std::ifstream archEntrada(rutaRegistros.c_str(), std::ios::in);

	int v_incorrectos = 0;
	int v_correctos = 0;
	int v_linea_numero = 0;


	while(!archEntrada.eof()) {
		string linea;
		getline(archEntrada, linea);

		if (linea.size() > 0) {
			v_linea_numero++;

			cout<< "Linea Numero " << v_linea_numero << endl;
			cout << linea << endl;

			//IdConsulta:
			int pos_coma = linea.find(',');

			int v_IdConsulta = Utilitarios::stringToInt(linea.substr(0, pos_coma));

			string cadena2 = linea.substr(pos_coma+1);

			cout << "v_IdConsulta: " << v_IdConsulta << endl;


			//IdServicio:
			pos_coma = cadena2.find(',');

			int v_IdServicio = Utilitarios::stringToInt(cadena2.substr(0, pos_coma));

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_IdServicio: " << v_IdServicio << endl;

			//idUsuario:
			pos_coma = cadena2.find(',');

			int v_idUsuario = Utilitarios::stringToInt(cadena2.substr(0, pos_coma));

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_idUsuario: " << v_idUsuario << endl;



			//consulta
			//Texto
			pos_coma = cadena2.find(',');

			string v_consulta_texto = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_consulta_texto: " << v_consulta_texto << endl;

			//hora
			pos_coma = cadena2.find(',');

			string v_consulta_hora = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_consulta_hora: " << v_consulta_hora << endl;

			//fecha
			pos_coma = cadena2.find(',');

			string v_consulta_fecha = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_consulta_fecha: " << v_consulta_fecha << endl;

			Publicacion v_consulta;

			v_consulta.texto = v_consulta_texto;
			v_consulta.fecha = v_consulta_fecha;
			v_consulta.hora = v_consulta_hora;


			//respuesta
			//Texto
			pos_coma = cadena2.find(',');

			string v_respuesta_texto = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_respuesta_texto: " << v_respuesta_texto << endl;

			//hora
			pos_coma = cadena2.find(',');

			string v_respuesta_hora = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_respuesta_hora: " << v_respuesta_hora << endl;
			Publicacion v_respuesta;

			//fecha
			pos_coma = cadena2.find(',');

			string v_respuesta_fecha = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_respuesta_fecha: " << v_respuesta_fecha << endl;

			v_respuesta.texto = v_respuesta_texto;
			v_respuesta.fecha = v_respuesta_fecha;
			v_respuesta.hora = v_respuesta_hora;


			//Oculto:
			pos_coma = cadena2.find(',');
			bool v_oculto;
			int v_oculto_texto = Utilitarios::stringToInt(cadena2.substr(0, pos_coma));

			if (v_oculto_texto == 0)
			{
				v_oculto = true;
			}
			else
			{
				v_oculto = false;
			}

			cout << "v_oculto_texto: " << v_oculto_texto << endl;


			//CREACION DEL OBJETO


			Consulta consulta1(v_IdConsulta,v_IdServicio, v_idUsuario);

			cout  << "Objeto Creado. "<< endl;


			//Setters:
			consulta1.setConsulta(v_consulta);
			consulta1.setRespuesta(v_respuesta);
			consulta1.ocultar(v_oculto);

			//Visualizo los datos del Objeto:
			cout << "Datos almacenados en el objeto"<< endl;
			cout << "Id: " << consulta1.getId()<< endl;
			cout << "IdServicio: " << consulta1.getId()<< endl;
			cout << "IdUsuario: " << consulta1.getIdUsuario()<< endl;
			Publicacion v_consulta_objeto = consulta1.getConstulta();

			cout << "Consulta: " << endl;
			cout << "    Fecha: " + v_consulta_objeto.fecha << endl;
			cout << "    Hora: " + v_consulta_objeto.hora << endl;
			cout << "    Texto: " + v_consulta_objeto.texto << endl;

			Publicacion v_respuesta_objeto = consulta1.getRespuesta();
			cout << "Respueta: " << endl;
			cout << "    Fecha: " + v_respuesta_objeto.fecha << endl;
			cout << "    Hora: " + v_respuesta_objeto.hora << endl;
			cout << "    Texto: " + v_respuesta_objeto.texto << endl;


			cout << "Grabar el nuevo objeto a disco: ";

			bool v_resultado = false;

			v_resultado = sistema.crearConsulta(consulta1);

			if (v_resultado){
				cout << "La consulta se ha grabado correctamente." << endl;
				v_correctos++;
			}
			else
			{
				cout << "Se presentaron problemas durante la grabación de los datos." << endl;
				v_incorrectos++;
			}

			cout << "Fin de La Linea" << endl;
		}
	}
	cout << "Fin de Archivo" << endl;
	archEntrada.close();
	cout <<  endl;
	cout << "****************************************************" << endl;
	cout << "Cantidad de Registros: "<< (v_correctos + v_incorrectos) << endl;
	cout << "Registros Procesados Correctamente: "<< v_correctos << endl;
	cout << "Registros con Errores: "<< v_incorrectos << endl;
}




void Cargar_Archivo::cargar_cotizaciones(Sistema& sistema, string rutaRegistros) {
	std::ifstream archEntrada(rutaRegistros.c_str(), std::ios::in);

	int v_incorrectos = 0;
	int v_correctos = 0;
	int v_linea_numero = 0;

/*
 *
	int idServicio;
	int idUsuario;
	Publicacion pedido;
 *
 *
 *
 */


	while(!archEntrada.eof()) {
		string linea;
		getline(archEntrada, linea);

		if (linea.size() > 0) {
			v_linea_numero++;

			cout<< "Linea Numero " << v_linea_numero << endl;
			cout << linea << endl;

			//IdCotizacion:
			int pos_coma = linea.find(',');

			int v_IdCotizacion = Utilitarios::stringToInt(linea.substr(0, pos_coma));

			string cadena2 = linea.substr(pos_coma+1);

			cout << "v_IdCotizacion: " << v_IdCotizacion << endl;


			//IdServicio:
			pos_coma = cadena2.find(',');

			int v_IdServicio = Utilitarios::stringToInt(cadena2.substr(0, pos_coma));

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_IdServicio: " << v_IdServicio << endl;

			//IdUsuario:
			pos_coma = cadena2.find(',');

			int v_IdUsuario = Utilitarios::stringToInt(cadena2.substr(0, pos_coma));

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_IdUsuario: " << v_IdUsuario << endl;



			//pedido
			//Texto
			pos_coma = cadena2.find(',');

			string v_pedido_texto = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_pedido_texto: " << v_pedido_texto << endl;

			//fecha
			pos_coma = cadena2.find(',');

			string v_pedido_fecha = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_pedido_fecha: " << v_pedido_fecha << endl;

			//hora
			pos_coma = cadena2.find(',');

			string v_pedido_hora = cadena2.substr(0, pos_coma);

			cadena2 = cadena2.substr(pos_coma+1);

			cout << "v_pedido_hora: " << v_pedido_hora << endl;


			Publicacion v_pedido;

			v_pedido.texto = v_pedido_texto;
			v_pedido.fecha = v_pedido_fecha;
			v_pedido.hora = v_pedido_hora;



			//CREACION DEL OBJETO


			Cotizacion cotizacion1(v_IdCotizacion, v_IdServicio, v_IdUsuario);

			cout  << "Objeto Creado. "<< endl;

			//Setters:
			cotizacion1.setPedido(v_pedido);

			//Visualizo los datos del Objeto:
			cout << "Datos almacenados en el objeto"<< endl;
			cout << "Id Cotización: " << cotizacion1.getId()<< endl;
			cout << "IdServicio: " << cotizacion1.getIdServicio()<< endl;
			cout << "IdUsuario: " << cotizacion1.getIdUsuario()<< endl;
			Publicacion v_pedido_objeto = cotizacion1.getPedido();

			cout << "Pedido: " << endl;
			cout << "    Fecha: " + v_pedido_objeto.fecha << endl;
			cout << "    Hora: " + v_pedido_objeto.hora << endl;
			cout << "    Texto: " + v_pedido_objeto.texto << endl;


			cout << "Grabar el nuevo objeto a disco: ";

			bool v_resultado = false;

			v_resultado = sistema.crearCotizacion(cotizacion1);

			if (v_resultado){
				cout << "La cotizacion se ha grabado correctamente." << endl;
				v_correctos++;
			}
			else
			{
				cout << "Se presentaron problemas durante la grabación de los datos." << endl;
				v_incorrectos++;
			}

			cout << "Fin de La Linea" << endl;
		}
	}
	cout << "Fin de Archivo" << endl;
	archEntrada.close();
	cout <<  endl;
	cout << "****************************************************" << endl;
	cout << "Cantidad de Registros: "<< (v_correctos + v_incorrectos) << endl;
	cout << "Registros Procesados Correctamente: "<< v_correctos << endl;
	cout << "Registros con Errores: "<< v_incorrectos << endl;
}
